/**
 * 二维平面给若干个点，问能够构成多少个满足条件的矩形
 * 条件为：长或宽为1
 * 首先考虑x坐标，将x坐标相同的点依次记录，即Map[x][i] == y，
 * 其含义为坐标为x的第i个点的y坐标
 * 
 * for x1, x2 是 Map 中相邻的两个数据项:
 *     if x1 + 1 != x2: continue
 *     此时x方向相差为1，再数一下Map[x1]与Map[x2]有多少个相同的y即可
 *     注意到二者都是已排序的数组，这是一个典型的归并过程
 *     假设一共有c个相同的y，则此处可对答案贡献 c*(c-1)/2
 * 
 * 然后对y做同样的处理
 * 这样会重复计算边长为1的正方形，所以需要同时统计出该数值，减去即可
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;

map<int, vi> X;
map<int, vi> Y;
vpii Vec;
int N;

llt Ans = 0;
llt Single = 0;

void proc(const map<int, vi> & m){
    auto it = ++m.begin();
    auto jt = m.begin();
    auto et = m.end();
    while(it != et){
        auto pre = jt->first;
        auto cur = it->first;
        if(cur - pre != 1) continue;

        auto at = jt->second.begin();
        auto bt = it->second.begin();
        auto aet = jt->second.end();
        auto bet = it->second.end();

        llt c = 0;
        while(at != aet and bt != bet){
            if(*at < *bt) ++at;
            else if(*bt < *at) ++bt;
            else{
                c += 1;
                if(at > jt->second.begin() and bt > it->second.begin()){
                    if(*at - *(at - 1) == 1 and *bt - *(bt - 1) == 1){
                        Single += 1;
                    }
                }
                ++at, ++bt;
            }
        }

        Ans += c * (c - 1LL) / 2LL;
        ++it; ++jt;
    }
}

void work(){
    cin >> N;
    Vec.assign(N, {});
    for(auto & p : Vec){
        cin >> p.first >> p.second;
        X[p.first].emplace_back(p.second);
        Y[p.second].emplace_back(p.first);
    }

    for(auto & p : X){
        sort(p.second.begin(), p.second.end());
    }
    for(auto & p : Y){
        sort(p.second.begin(), p.second.end());
    }

    Ans = Single = 0;
    proc(X);
    proc(Y);

    assert(0 == Single % 2);
    Single /= 2;
    Ans -= Single;
    cout << Ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
    while(nofkase--) work();
	return 0;
}